LeetCode 21
Merge Two Sorted Lists
Problem Description:
合并两个有序链表
具体的题目信息:
https://leetcode.com/problems/merge-two-sorted-lists/description/Solution:
解题思路
我们把l1
作为结果输出链表,扫描l2
链表结点然后在l1
链表上进行增加结点的操作。具体来说,在l1
链表上定义两个指针p1
和pre
,p1
指向当前进行比较的结点,pre
指向比较结点的上一结点(该指针是为了方便将l2
链表上的结点插入l1
)。在l2
链表上定义一个指针p2
,指向当前进行比较的结点。编程实现
(1)当p1
指向结点数值 <p2
指向结点数值时,更新p1
和pre
。
(2)当p1
指向结点数值 >=p2
指向结点数值时,分为p1
是否指向首结点进行讨论。
(3)当任一链表遍历完循环结束,如果是l2
遍历完说明两个链表已经完成合并,否则将l2
剩下比l1
都大的结点连接在l1
后面。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == NULL)
return l2;
if (l2 == NULL)
return l1;
ListNode* pre = l1;
ListNode* p1 = l1; //结果链表
ListNode* p2 = l2;
ListNode* temp;
while(p1 && p2) {
if (p1->val < p2->val) {
pre = p1;
p1 = p1->next;
} else if (p1->val == p2->val) {
if (p1 == l1) {
p1 = p1->next;
}
temp = p2->next;
p2->next = p1;
pre->next = p2;
pre = p2;
p2 = temp;
} else {
if (p1 == l1) {
temp = p2->next;
p2->next = p1;
pre = p2;
//下面这一行指明l1的头结点
l1 = p2;
p2 = temp;
} else {
temp = p2->next;
p2->next = p1;
pre->next = p2;
pre = p2;
p2 = temp;
}
}
}
if (p2 == NULL)
return l1;
p1 = pre;
while (p2) {
p1->next = p2;
p1 = p1->next;
p2 = p2->next;
}
p1->next = NULL;
return l1;
}
};