📌  相关文章
📜  链表交替节点之和(1)

📅  最后修改于: 2023-12-03 15:42:07.956000             🧑  作者: Mango

链表交替节点之和

介绍

给定一个链表,将链表中每两个相邻的节点,用它们的和代替原来的节点。即第一个节点和第二个节点的和,用它们的和代替第一个节点和第二个节点。这样,新链表的长度就是原链表长度的一半。

例如:

输入:1 -> 2 -> 3 -> 4
输出:3 -> 5 -> 7

解法
实现思路

我们可以使用双指针法来遍历链表。遍历到相邻的节点时,计算它们的和,创建一个新节点并将当前节点指向新节点,下一个节点期望指向下一个相邻的节点。如此往复直到遍历完整个链表。

代码实现

Python代码示例:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def addTwoNumbers(head: ListNode) -> ListNode:
    if not head or not head.next:
        return head

    p1 = head
    p2 = head.next
    dummy = ListNode(0)  # 新链表的哑节点
    prev = dummy

    while p1 and p2:
        # 计算相邻节点的和
        val = p1.val + p2.val
        # 创建一个新节点
        node = ListNode(val % 10)
        # 将新节点插入到新链表尾部
        prev.next = node
        prev = node
        # 将下一个节点期望指向下一个相邻的节点
        p1 = p2.next
        p2 = p1.next if p1 else None

    # 处理剩余的节点
    if p1:
        prev.next = p1
    elif p2:
        prev.next = p2

    return dummy.next

Java代码示例:

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public ListNode addTwoNumbers(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }

    ListNode p1 = head;
    ListNode p2 = head.next;
    ListNode dummy = new ListNode(0);  // 新链表的哑节点
    ListNode prev = dummy;

    while (p1 != null && p2 != null) {
        // 计算相邻节点的和
        int val = p1.val + p2.val;
        // 创建一个新节点
        ListNode node = new ListNode(val % 10);
        // 将新节点插入到新链表尾部
        prev.next = node;
        prev = node;
        // 将下一个节点期望指向下一个相邻的节点
        p1 = p2.next;
        p2 = p1 != null ? p1.next : null;
    }

    // 处理剩余的节点
    if (p1 != null) {
        prev.next = p1;
    } else if (p2 != null) {
        prev.next = p2;
    }

    return dummy.next;
}
总结

本题是一道链表操作的基础题目,考察链表的基本操作、指针的使用等知识点。我们可以使用双指针法较为方便地完成本题。另外,在实战中可能还需要考虑一些边界情况,如链表长度为奇数或偶数、链表中存在空节点等。