1. 思想
- 用 tail 指针记录新链表的尾部,每次迭代从两个有序链表的头部选择最小结点 head,然后三步走:
1). tail 指向该结点
2) 更新 head
3) 更新 tail
2. 算法代码
/**
* @brief 合并两个有序链表
* 关键变量:
* (1)newhead、tail: 合并链表的头和尾
* (2)list1 和 list2: 需要合并的两条链表
*/
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* head, *tail;
// 利用 dummy 头结点,保证 newhead 和 tail 一定有效
head = tail = new ListNode();
while(list1 && list2){
if(list1->val <= list2->val){
// tail 指向新加入的结点,然后 list1 头指针后移
tail->next = list1;
list1 = list1->next;
}else{
tail->next = list2;
list2 = list2->next;
}
// 记得更新 tail
tail = tail->next;
}
if(list1)
tail->next = list1;
if(list2)
tail->next= list2;
return head->next;
}
- 注意: 带有 tail 指针的时候,更加要懂得利用 dummy node。