剑指offer:合并两个有序链表

扶醉桌前 提交于 2020-03-04 19:47:44

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

解题思路

一、非递归

①利用两个node(head、cur),head指向头节点,cur指向当前处理的节点。

②遍历比较list1和list2的元素,将小的元素添加入链表,如果一条链表遍历结束,将另一条剩余元素合并到新链表。

③最后返回头节点。

    public ListNode Merge(ListNode list1,ListNode list2) {
            if(list1 == null){ //list1为空
                return list2;
            }
            if(list2 == null){ //list2为空
                return list1;
            }
            ListNode head = null;
            ListNode cur = null;
            while(list1 != null && list2 != null){ //当list1 与 list2 都不为空
                  if(list1.val < list2.val){  //list1的元素 小于 list2的元素  
                      if(head == null){      //当添加第一个元素
                          cur = head = list1; //头节点指向第一个元素
                      }else{        
                          cur.next = list1;  //将元素添加入链表 
                          cur = cur.next;   //移动cur指针
                      }
                      list1 = list1.next;  //移动list1指针
                  }else{
                      if(head == null){
                          cur = head = list2;
                      }else{
                          cur.next = list2;
                          cur = cur.next;
                      }
                      list2 = list2.next;
                  }
            }
            if(list1 == null){  //list1遍历结束
                cur.next = list2; //将list2剩余元素添加入新链表
            }
            if(list2 == null){  //list2遍历结束
                cur.next = list1;//将list1剩余元素添加入新链表
            }
            return head;  //返回头节点
        }

二、递归

逐个比较list1的元素与list2的元素大小,将小的元素添加到另一条链表,最后两条链表都是有序链表,返回任意一条即可。

public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null){
            return list2;
        }
        if(list2 == null){
            return list1;
        }
        while(list1 != null && list2 != null){
            if(list1.val < list2.val){  //比较list1的val 与 list2的val
                //将list2的元素添加到list1中,直到list1.val 》 list2.val
                list1.next = Merge(list1.next,list2); 
                return list1;                                               
            }else{
                //将list1的元素添加到list2中,直到list1.val 《 list2.val
                list2.next = Merge(list1,list2.next);
                return list2;
            }
        }
        return list1; //list1 == list2
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!