2023/01/21,除夕夜刷题,祝福大家新年快乐,诸事顺遂~
喜欢的朋友可以点赞关注订阅,您的支持就是最大的动力,感谢~~~
问题描述:
给定两个有序链表,将其合并为一个有序链表,
https://leetcode.com/problems/merge-two-sorted-lists/description/
解题思路:
创建链表头,找出list1, list2 较小的节点,将其作为链表头,
生长链表:遍历list1, list2, 将较小的节点挂载在尾部 (curr)
处理链表尾: list1, list2 长度可能不同,剩余部分直接挂在尾部
考虑特殊情况:list1, list2 可能为空,直接返回其余部分
答案C语言版本:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
static inline void list_add_to(struct ListNode *list, struct ListNode *to)
{
list->next = to;
to->next = list;
}
static inline bool list_is_last(struct ListNode *list)
{
return list->next == NULL ? true : false;
}
#define list_for_each(pos, head) \
for (pos = head; !list_is_last(pos); pos = pos->next)
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
struct ListNode *res = NULL, *curr = NULL;
if (!list1)
return list2;
if (!list2)
return list1;
if (list1->val > list2->val) {
res = list2;
list2 = list2->next;
} else {
res = list1;
list1 = list1->next;
}
curr = res;
while (list1 && list2) {
if (list1->val < list2->val) {
curr->next = list1;
list1 = list1->next;
} else {
curr->next = list2;
list2 = list2->next;
}
curr = curr->next;
}
if (list1)
curr->next = list1;
if (list2)
curr->next = list2;
return res;
}