美文网首页
leetcode List problems

leetcode List problems

作者: weiinter105 | 来源:发表于2018-11-17 23:35 被阅读0次

    翻转链表I

    Example:

    Input: 1->2->3->4->5->NULL
    Output: 5->4->3->2->1->NULL
    Follow up:

    A linked list can be reversed either iteratively or recursively. Could you implement both?

    1. implement iteratively
    public class Solution {
    
        public ListNode reverseListiteratively(ListNode head) {
            if(head == null || head.next == null)
                return head;
            ListNode prev = null;
            ListNode cur = head;
            ListNode next = null;
            ListNode newhead = null;
            while(cur!=null){
                next = cur.next; //一旦cur node指向prev,原来的next就找不到了,因此需要提前保存next
                if(next == null)
                    newhead = cur; //保存要返回的newhead的值
                cur.next = prev;
                prev = cur;
                cur = next;
            }
            return newhead;
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int arrays[] = {1,2,3,4,5};
            ListNode head = LinkTools.change_array_to_list(arrays);
            LinkTools.printList(new Solution().reverseListiteratively(head));
        }
    
    }
    
    1. implement recursively
    public class Solution {
        public ListNode reverseListrecursively(ListNode head){
            if(head == null || head.next == null) //跳出循环的条件
                return head;
            
            ListNode cur = head; //保存当前的head结点
            ListNode newhead = reverseListrecursively(cur.next); 
            //假设此时除了head结点,其他链表已经翻转完成,新的head为newhead
            //此时当前的head还指向其next,需要进行翻转操作,让原来的next node指向自己,自己的next制空
            cur.next.next = cur;
            cur.next = null;
            //返回newhead
            return newhead;
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int arrays[] = {1,2,3,4,5};
            ListNode head = LinkTools.change_array_to_list(arrays);
            LinkTools.printList(new Solution().reverseListrecursively(head));
        }
    }
    

    翻转链表II

    Reverse a linked list from position m to n. Do it in one-pass.

    Note: 1 ≤ m ≤ n ≤ length of list.

    Example:

    Input: 1->2->3->4->5->NULL, m = 2, n = 4
    Output: 1->4->3->2->5->NULL

    public ListNode reverseBetween(ListNode head, int m, int n) {
            if(head == null || head.next==null || m==n)
                return head;
            //将链表分开为三个链表再重新进行连接,但要考虑m=1的特殊情况,加一个假的头结点是最方便的方法,省去许多特殊判断
            ListNode dummy = new ListNode(-1);
            ListNode part2_head = null;
            ListNode part2_end = null;  
            ListNode part3_head = null;
            ListNode part1_end = null;
            dummy.next = head;
            ListNode prev = dummy;
            ListNode cur = head;
            for(int i = 1;i<m;i++){
                prev = prev.next;
                cur = cur.next;
            }
            part1_end = prev;
            part2_head = cur;
            part1_end.next = null; //暂时断链
            for(int i = m;i<n;i++){
                cur = cur.next;
            }
            part2_end = cur;
            part3_head = cur.next;
            part2_end.next = null;//暂时断链
            reverseListiteratively(part2_head);
            part1_end.next = part2_end;
            part2_head.next = part3_head;
            
            return dummy.next;   
        }
    

    Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome.

    Example 1:

    Input: 1->2
    Output: false
    Example 2:

    Input: 1->2->2->1
    Output: true
    Follow up:
    Could you do it in O(n) time and O(1) space?

     public boolean isPalindrome(ListNode head) {
             //关键在先找到链表的终点,采取快慢指针的方式
            if(head == null || head.next == null)
                return true;
            ListNode fast = head;
            ListNode slow = head;
            while(fast.next!=null&&fast.next.next!=null){
                fast = fast.next.next;
                slow = slow.next;
            }
            ListNode list2_node = reverseListiteratively(slow.next);
            ListNode list1_node = head;
            while(list2_node!=null){
                if(list1_node.val!=list2_node.val){
                    return false;
                }
                list1_node = list1_node.next;
                list2_node = list2_node.next;
            }
            return true;
        }
    

    Sort List

    Sort a linked list in O(n log n) time using constant space complexity.

    Example 1:

    Input: 4->2->1->3
    Output: 1->2->3->4
    Example 2:

    Input: -1->5->3->4->0
    Output: -1->0->3->4->5

    public ListNode sortList(ListNode head) {
            //最容易想到的应该是递归
            if(head == null || head.next == null)
                return head;
            ListNode fast = head;
            ListNode slow = head;
            while(fast.next!=null&&fast.next.next!=null){
                fast = fast.next.next;
                slow = slow.next;
            }
            ListNode list2 = slow.next;
            ListNode list1 = head;
            slow.next = null;//断连成两个链表
            list1 = sortList(list1);
            list2 = sortList(list2);
            ListNode newhead = null;
            if(list1.val<list2.val){
                newhead = list1;
                list1 = list1.next;
            }
            else{
                newhead = list2;
                list2 = list2.next;
            }
            ListNode cur = newhead;
            while(list1!=null && list2!=null){
                if(list1.val<list2.val){
                    cur.next = list1;
                    list1 = list1.next;
                    cur = cur.next;
                    
                }else{
                    cur.next = list2;
                    list2 = list2.next;
                    cur = cur.next;
                }
            }
            cur.next = (list1==null)?list2:list1;
            return newhead;
        }
    

    相关文章

      网友评论

          本文标题:leetcode List problems

          本文链接:https://www.haomeiwen.com/subject/secwfqtx.html