Add Two Numbers
链表前面的数相当与低位,模拟整数的相加运算
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode c1 = l1;
ListNode c2 = l2;
ListNode sentinel = new ListNode(0); #设置头结点
ListNode d = sentinel;
int sum = 0;
while (c1 != null || c2 != null) {
sum /= 10;
if (c1 != null) {
sum += c1.val;
c1 = c1.next;
}
if (c2 != null) {
sum += c2.val;
c2 = c2.next;
}
d.next = new ListNode(sum % 10);
d = d.next;
}
if (sum / 10 == 1)
d.next = new ListNode(1);
return sentinel.next;
}
}
17.Letter Combinations of a Phone Number
My solution: Using backstracking
String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public List<String> letterCombinations(String digits) {
char[] digit_array=digits.toCharArray();
List<String> result=new LinkedList<>();
if(digits.length()==0) return result;
backstrack(result, 0, digit_array, new StringBuilder());
return result;
}
public void backstrack(List<String> result,int index,char[] digit_array,StringBuilder sb){
if(index==digit_array.length){
result.add(sb.toString());
return ;
}
int num=Character.getNumericValue(digit_array[index]);
for(int i=0;i<mapping[num].length();i++){//遍历每个字母
sb.append(mapping[num].charAt(i));
backstrack(result, index+1, digit_array, sb);
sb.delete(sb.length()-1, sb.length());
}
}
public List<String> letterCombinations(String digits) {
LinkedList<String> ans = new LinkedList<String>();
String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
ans.add("");
for(int i =0; i<digits.length();i++){
int x = Character.getNumericValue(digits.charAt(i));
while(ans.peek().length()==i){
String t = ans.remove();
for(char s : mapping[x].toCharArray())
ans.add(t+s);
}
}
return ans;
}
21.Merge Two Sorted Lists
My solution: non-recursive
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy=new ListNode(Integer.MIN_VALUE);
ListNode tail=dummy;
while(l1!=null&l2!=null){
if(l1.val<l2.val){
tail.next=l1;
l1=l1.next;
}
else{
tail.next=l2;
l2=l2.next;
}
tail=tail.next;
}
tail.next=l1!=null?l1:l2;
return dummy.next;
}
recursive:
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l2.next, l1);
return l2;
}
}
28. Implement strStr()
Using violent solution
public int strStr(String haystack, String needle) {
for (int i = 0; ; i++) {
for (int j = 0; ; j++) {
if (j == needle.length()) return i;
if (i + j == haystack.length()) return -1;
if (needle.charAt(j) != haystack.charAt(i + j)) break;
}
}
}
Using kmp
49. Group Anagrams
public List<List<String>> groupAnagrams(String[] strs) {
if (strs == null || strs.length == 0) return new ArrayList<List<String>>();
Map<String, List<String>> map = new HashMap<String, List<String>>();
for (String s : strs) {
char[] ca = s.toCharArray();
Arrays.sort(ca);
String keyStr = String.valueOf(ca);
if (!map.containsKey(keyStr)) map.put(keyStr, new ArrayList<String>());
map.get(keyStr).add(s);
}
return new ArrayList<List<String>>(map.values());
}
108. Convert Sorted Array to Binary Search Tree
public TreeNode sortedArrayToBST(int[] num) {
if (num.length == 0) {
return null;
}
TreeNode head = helper(num, 0, num.length - 1);
return head;
}
public TreeNode helper(int[] num, int low, int high) {
if (low > high) { // Done
return null;
}
int mid = (low + high) / 2;
TreeNode node = new TreeNode(num[mid]);
node.left = helper(num, low, mid - 1);
node.right = helper(num, mid + 1, high);
return node;
}
118. Pascal’s Triangle
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
if (numRows <=0){
return triangle;
}
for (int i=0; i<numRows; i++){
List<Integer> row = new ArrayList<Integer>();
for (int j=0; j<i+1; j++){
if (j==0 || j==i){
row.add(1);
} else {
row.add(triangle.get(i-1).get(j-1)+triangle.get(i-1).get(j));
}
}
triangle.add(row);
}
return triangle;
}
153. Find Minimum in Rotated Sorted Array
public int findMin(int[] nums) {
int start=0,end=nums.length-1;
while(start<end){
if(nums[start]<nums[end]) return nums[start];
int mid=start+(end-start)/2;
if(nums[mid]>=nums[start]) start=mid+1;//等于号是必须的,因为mid有可能等于start
else end=mid;
}
return nums[start];
}