当前位置:   article > 正文

leetcode21. 合并两个有序链表

leetcode21. 合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:

  1. 输入:1->2->4, 1->3->4
  2. 输出:1->1->2->3->4->4

思路:利用归并排序的思想,循环遍历两个链表,如果遍历到的第一个链表的值小于第二个链表的值,那么将小的链表结点加入新的链表即可,反之如果比第二个链表的结点大,那么将第二个链表的结点加入新链表即可。直到遍历链表为空,将另外未遍历的结点加入新链表即可。

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
  11. ListNode newH = new ListNode(0);
  12. ListNode firstNode = newH; //保存新链表的头结点,防止赋值时丢失。
  13. while(l1 != null && l2 != null){
  14. if(l1.val <= l2.val){
  15. newH.next = l1;
  16. l1 = l1.next;
  17. }else{
  18. newH.next = l2;
  19. l2 = l2.next;
  20. }
  21. newH = newH.next;
  22. }
  23. while(l1 != null){
  24. newH.next = l1;
  25. l1 = l1.next;
  26. newH = newH.next;
  27. }
  28. while(l2 != null){
  29. newH.next = l2;
  30. l2 = l2.next;
  31. newH = newH.next;
  32. }
  33. return firstNode.next;
  34. }
  35. }

大神代码:比较简洁,我还是欠考虑,忘记了考虑为空的情况下,就可直接返回了。简洁之处,将遍历到任意一条链表为空的时候,将后续代码的条件判断合并到了判断语句中。

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
  11. if(l1==null)return l2;
  12. if(l2==null)return l1;
  13. ListNode listNode = new ListNode(0);
  14. ListNode firstNode=listNode;
  15. while(l1!=null||l2!=null){
  16. if(l1!=null&&(l2==null||l1.val<=l2.val)){
  17. listNode.next=l1;
  18. l1=l1.next;
  19. }else{
  20. listNode.next=l2;
  21. l2=l2.next;
  22. }
  23. listNode=listNode.next;
  24. }
  25. return firstNode.next;
  26. }
  27. }

c 语言:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
  9. struct ListNode head;
  10. struct ListNode *pre = &head;
  11. while(l1 && l2){
  12. if(l1->val <= l2->val){
  13. pre->next = l1;
  14. l1 = l1->next;
  15. }else{
  16. pre->next = l2;
  17. l2 = l2->next;
  18. }
  19. pre = pre->next;
  20. }
  21. pre->next = (NULL == l1)?l2:l1;
  22. return head.next;
  23. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/395445
推荐阅读
相关标签
  

闽ICP备14008679号