目录
1 力扣_21 合并两个有序链表
链接:力扣-合并两个有序数组
1.1 示例
1.2 思路
依次比较链表中的节点,每次取小的节点,尾插到新链表
1.2.1 方法1:直接创建
head / tail
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) { struct ListNode* head, * tail; head = tail = NULL; if (list1 == NULL) { return list2; //当其中一个链表为NULL,则直接返回另一个链表即可 } else if (list2 == NULL) { return list1; } else {(list2->val) > (list1->val) ? (head = tail = list1, list1 = list1->next) : (head = tail = list2, list2 = list2->next); // 三目操作符,上来先给head和tail一个值,如果是l1小就把l1给head/tail // 否则l2 while (list1 && list2) { if ((list1->val) > (list2->val)) { tail->next = list2; list2 = list2->next; // 比较大小,谁小,谁放tail的next,head不变,记录头 } else { tail->next = list1; list1 = list1->next; } tail = tail->next; } // 最后,当一个为NULL时,退出上面循环,并将剩下的一个链表直接加入tail的next后 if (list1 == NULL) { tail->next = list2; } else { tail->next = list1; } return head; } }1.2.2 用一个哨兵位的头节点
struct ListNode* mergeTwoLists2(struct ListNode* list1, struct ListNode* list2) { struct ListNode* head, * tail; head = tail = NULL; if (list1 == NULL) { return list2; } else if (list2 == NULL) { return list1; } else { head = tail = (struct ListNode*)malloc(sizeof(struct ListNode)); // 直接malloc一个哨兵位头节点 while (list1 && list2) { if ((list1->val) > (list2->val)) { tail->next = list2; list2 = list2->next; } else { tail->next = list1; list1 = list1->next; } tail = tail->next; } if (list1 == NULL) { tail->next = list2; } else { tail->next = list1; } return head->next; } // 因为是malloc,所以记得释放,不过应先保存到一个指针里,再释放 struct ListNode* list = head->next; free(head); return list; }
力扣_21 合并两个有序链表
于 2022-12-07 23:50:54 首次发布