合并两个有序链表
题目
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路
因为两个链表是有序的,创建两个标记指针,一个指向l1链表,一个指向l2链表,比较两个的值,若l1指向的值小,p3就等于p1,指针后移,反之相同。当一个链表值被循环完后,另一个链表续在l3后
特殊情况:
若有一个链表为空,则l3直接等于另一个链表
因为每次都是续在p3的next上,故l3头结点没有值,返回时从l3的next返回
代码
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
struct ListNode *l3 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *p1 = l1;
struct ListNode *p2 = l2;
struct ListNode *p3 = l3;
if(!p1) {
l3 = l2;
return l3;
}
if(!p2) {
l3 = l1;
return l3;
}
while(p1 && p2) {
if(p1 -> val < p2 -> val) {
p3 -> next = p1;
p3 = p1;
p1 = p1 -> next;
} else {
p3 -> next = p2;
p3 = p2;
p2 = p2 -> next;
}
}
if(!p1) {
for(struct ListNode *p = p3; p2 != NULL; ) {
p -> next = p2;
p2 = p2 -> next;
p = p -> next;
}
}
if(!p2) {
for(struct ListNode *p = p3; p1 != NULL; ) {
p -> next = p1;
p1 = p1 -> next;
p = p -> next;
}
}
return l3 -> next;
}