📅  最后修改于: 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;
}
本题是一道链表操作的基础题目,考察链表的基本操作、指针的使用等知识点。我们可以使用双指针法较为方便地完成本题。另外,在实战中可能还需要考虑一些边界情况,如链表长度为奇数或偶数、链表中存在空节点等。