Leetcode: Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

public ListNode mergeKLists(ArrayList<ListNode> lists) {
        // Start typing your Java solution below
        // DO NOT write main() function
        ListNode fakeHead = new ListNode(-1);
        ListNode runner = fakeHead;
        int nonTraversed = 0;
        //count the number of not-null ListNode
        for(ListNode curr:lists){
            if(curr!=null){
                nonTraversed++;
            }
        }
        while(nonTraversed>0){
            int min = Integer.MAX_VALUE;
            int minIndex = -1;
            for(int i=0;i<lists.size();i++){
                ListNode curr = lists.get(i);
                if(curr!=null){
                    if(curr.val<min){
                        minIndex = i;
                        min = curr.val;
                    }
                }
            }
            runner.next = lists.get(minIndex);
            runner = runner.next;
            lists.set(minIndex, lists.get(minIndex).next);
            if(lists.get(minIndex)==null){
                nonTraversed--;
            }
        }
        return fakeHead.next;
    }

O(N*k) k is the size of lists and N is the total number of elements in all the inputs lists

We can improve our solution by using Heap which can have O(Nlogk) runtime complexity.

 

 

FacebookTwitterGoogle+Share

Leetcode: Roman to Integer

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

public int romanToInt(String s) {
        // Start typing your Java solution below
        // DO NOT write main() function
        ArrayList<Character> oneLetters = new ArrayList<Character>();
        oneLetters.add('I');
        oneLetters.add('X');
        oneLetters.add('C');
        oneLetters.add('M');
        ArrayList<Character> fiveLetters = new ArrayList<Character>();
        fiveLetters.add('V');
        fiveLetters.add('L');
        fiveLetters.add('D');

        int num=0;
        for(int i=0;i<s.length();i++){
            int bit = fiveLetters.indexOf(s.charAt(i));
            //if the current letter is in fiveLetters
            if(bit!=-1){
                num+=5*(int)Math.pow(10,bit);
            }else{
                bit = oneLetters.indexOf(s.charAt(i));
                //if the current letter is in oneLetters && there is a bigger number afterwards
                if( i+1<s.length() && 
                  (fiveLetters.indexOf(s.charAt(i+1))>=bit ||
                   oneLetters.indexOf(s.charAt(i+1))>bit)){
                    num-=(int)Math.pow(10,bit);
                }
                //else, just add this num
                else{
                    num+=(int)Math.pow(10,bit);
                }
            }

        }
        return num;
    }

Leetcode: Integer to Roman

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

public String intToRoman(int num) {
        // Start typing your Java solution below
        // DO NOT write main() function
        String[] oneLetters = {"I","X","C","M"};
        String[] fiveLetters = {"V","L","D",""};
        String numStr = num+"";
        String output = "";
        for(int i=numStr.length()-1;i>=0;i--){
            String tmp = "";
            int bit = (int)num%(int)Math.pow(10,i+1)/(int)Math.pow(10,i);
            switch (bit){
                case 1: tmp = oneLetters[i];
                        break;
                case 2: tmp = oneLetters[i]+oneLetters[i];
                        break;
                case 3: tmp = oneLetters[i]+oneLetters[i]+oneLetters[i];
                        break;
                case 4: tmp = oneLetters[i]+fiveLetters[i];
                        break;
                case 5: tmp = fiveLetters[i];
                        break;
                case 6: tmp = fiveLetters[i]+oneLetters[i];
                        break;
                case 7: tmp = fiveLetters[i]+oneLetters[i]+oneLetters[i];
                        break;
                case 8: tmp = fiveLetters[i]+oneLetters[i]+oneLetters[i]+oneLetters[i];
                        break;
                case 9: tmp = oneLetters[i]+oneLetters[i+1];
                        break;
                default: tmp = "";
                        break;
            }
            output+=tmp;
        }
        return output;
    }

Leetcode: Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // Start typing your Java solution below
        // DO NOT write main() function
        ListNode runner1=l1;
        ListNode runner2=l2;
        ListNode head = new ListNode(-1);
        ListNode runner = head;
        int carry=0;
        while(runner1!=null || runner2!=null ||carry!=0){
            int val1 = runner1==null?0:runner1.val;
            int val2 = runner2==null?0:runner2.val;
            int sum =val1+val2+carry;
            if(sum>9){
                carry=1;
            }else{
                carry=0;
            }
            runner.next = new ListNode(sum%10);
            runner = runner.next;
            runner1 = runner1==null?null:runner1.next;
            runner2 = runner2==null?null:runner2.next;
        }

        return head.next;
    }

 

 

Leetcode: Word Ladder

Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.

Note:

  • Return 0 if there is no such transformation sequence.
  • All words have the same length.
  • All words contain only lowercase alphabetic characters.